home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1994 October / Macformat17.cdr / Shareware City / Developers / shutdown-fx-201-c / sfx ƒ / NMRP ƒ / NMRP.c next >
C/C++ Source or Header  |  1994-07-11  |  3KB  |  92 lines

  1. /**********************************************************************\
  2.  
  3. File:        NMRP.c
  4.  
  5. Purpose:    This module handles cleaning up after a Notification
  6.             Manager note has been displayed.
  7.             
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.
  12.  
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with this program in a file named "GNU General Public License".
  20. If not, write to the Free Software Foundation, 675 Mass Ave,
  21. Cambridge, MA 02139, USA.
  22.  
  23. \**********************************************************************/
  24.  
  25. extern long        ToolScratch : 0x09CE;
  26.  
  27. void FlushCodeCache(void) = 0xA0BD;
  28.  
  29. #define            _HwPriv            0xA198
  30. #define            _CacheFlush        0xA0BD
  31. #define            _Moof            0xA89F
  32.  
  33. pascal void main(NMRecPtr note)
  34. {
  35.     long            saveReturn;
  36.     Boolean            Caches040;
  37.     Boolean            Caches020;
  38.     
  39.     Caches040 = (GetOSTrapAddress(_HwPriv) != GetToolTrapAddress(_Moof));
  40.     Caches020 = (GetOSTrapAddress(_CacheFlush) != GetToolTrapAddress(_Moof));
  41.     
  42.     asm
  43.     {
  44.         move.l        note, a0
  45.         _NMRemove
  46.         
  47.         move.l        note, a0
  48.         move.l        OFFSET(NMRec, nmStr)(a0), a0
  49.         beq.s        @1
  50.         _DisposePtr
  51.         
  52. @1:        move.l        note, a0
  53.         _DisposePtr
  54.         
  55.         /* I don't like this - it uses low mem globals and assumes an     */
  56.         /* implicit link, not to mention that it's self-modifying code.   */
  57.         /* But, it seems to work.  Well, at least it compiles...          */
  58.         
  59.         /* ADDENDUM - this code assumes the following:                    */
  60.         /*  1) The compiler has put a LINK A6 at the start of the routine */
  61.         /*  2) The UNLK and RTS code at the end does not modify registers */
  62.         /*     D0 or A1, or ToolScratch                                   */
  63.         /*  3) _DisposeHandle does not modify register A1
  64.         /*  4) ToolScratch is not modified by any of the following traps: */
  65.         /*     _DisposeHandle, _RecoverHandle, _CacheFlush, and _HwPriv   */
  66.         
  67.         move.l        4(a6), saveReturn
  68.         move.l        #ToolScratch, a0
  69.         move.l        a0, 4(a6)
  70.         move.l        #0x2040A023, (a0)    ; movea.l    d0, a0 / _DisposeHandle
  71.         move.w        #0x4ED1, 4(a0)        ; jmp        (a1)
  72.     }
  73.     
  74.     if(Caches040)
  75.     {
  76.         FlushDataCache();
  77.         FlushInstructionCache();
  78.     }
  79.     else if(Caches020)
  80.     {
  81.         FlushCodeCache();
  82.     }
  83.     
  84.     asm
  85.     {
  86.         lea            main, a0
  87.         _RecoverHandle
  88.         move.l        a0, d0
  89.         move.l        saveReturn, a1
  90.     }
  91. }
  92.